package fag.editor;


import java.awt.GridLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

import fag.core.model.Animation;
import fag.core.model.Frame;

/**
 * Visualisation d'une animation
 * @author Thibault
 *
 */


public class AnimationPlayer extends Thread implements Runnable {
	
	private AnimationPanel animationPanel;
	private AnimationFrame animationFrame;
	private Animation animation;

	private boolean run = true;

	/**
	 * Constructeur par défaut
	 * @param animation
	 */
	public AnimationPlayer(Animation animation)
	{
		this.animation = animation;
		animationPanel = new AnimationPanel();
		animationFrame = new AnimationFrame(animationPanel);
		
		
		// On lance la lecture de l'animation
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				animationFrame.setVisible(true);
				start();
			}
		});
	}
	
	/**
	 * Implémentation de run()
	 * On affiche les frames une à une avec un intervalle de temps égal à la durée de la frame lue.
	 */
	public final void run(){
		
		ArrayList<Frame> animationClone = new ArrayList<Frame>(animation.getListFrame()); // clone de la liste de frames de l'animation
		while(run) {
			animationClone = (ArrayList<Frame>)animation.getListFrame().clone();
			for(Frame frame : animationClone)
			{
				if(frame.getBufferedImage()==null || frame.getDuration() == 0)
				{
					// si une frame est vide dans l'animation, on affiche un message d'erreur
						JOptionPane.showMessageDialog(animationFrame,
							    "There is an empty frame (image null or duration null).\nThanks to complete this frame and retry to play the animation.",
							    "Empty frame error",
							    JOptionPane.ERROR_MESSAGE);
						animationFrame.dispose(); // on ferme la fenêtre
						return; // on quitte la lecture de l'animation
				}
				else
				{
					animationPanel.setFrame(frame);
					animationPanel.repaint();
					animationFrame.repaint();
					try {
						sleep(frame.getDuration());
					} 
					
					catch (InterruptedException e) {
						
						e.printStackTrace();
					}
				}
			}
		}
    }
}